home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / BF_SDK11.ZIP / CPP_DEMO.CPP < prev    next >
C/C++ Source or Header  |  1996-06-06  |  8KB  |  227 lines

  1.  
  2.  
  3. //      CPP_DEMO.CPP
  4. //      test program for BFENG.OBJ
  5. //      programming language: MS Visual C++ 1.0, QuickWin
  6. //      memory model: large
  7. //      last update: 05/25/96
  8. //      (c)1996 Markus Hahn
  9.  
  10.  
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <time.h>
  15. #include <string.h>
  16. #include "blowfish.h"
  17.  
  18.  
  19.  
  20. // official testvectors from DDJ 10/95...
  21.  
  22. unsigned char key1[] = "abcdefghijklmnopqrstuvwxyz";
  23. unsigned long testdata1_p[2] = {0x424c4f57, 0x46495348};
  24. unsigned long testdata1_c[2] = {0x324ed0fe, 0xf413a203};
  25.  
  26. unsigned char key2[] = "Who is John Galt?";
  27. unsigned long testdata2_p[2] = {0xfedcba98, 0x76543210};
  28. unsigned long testdata2_c[2] = {0xcc91732b, 0x8022f684};
  29.  
  30.  
  31. #define  BIGBUFSIZE 32000
  32. #define  TESTLOOPS  400UL
  33.  
  34.  
  35.  
  36.  
  37. //  random32() - creates 32bit random value, don't use this in real crypt apps
  38. unsigned long random32()
  39. {
  40.   return ((unsigned long)rand() << 16) | (unsigned long)rand();
  41. };
  42.  
  43.  
  44.   
  45.  
  46. // global data... 
  47.  
  48.   unsigned long ulCBCIVL;  // IV == initalisation vector 
  49.   unsigned long ulCBCIVR;   
  50.   unsigned long ulCBCLeft;  
  51.   unsigned long ulCBCRight; 
  52.   unsigned char sMyKey[256];
  53.   unsigned long testbuf[6];
  54.   unsigned int     unI;
  55.   unsigned long ulStart;
  56.   unsigned long ulTime;
  57.   unsigned long ulRate;
  58.   unsigned long *pBoxes;
  59.   unsigned long BF_key[1058];
  60.   unsigned char biggy[BIGBUFSIZE];
  61.   clock_t       needed_time;
  62.  
  63.       
  64.  
  65. int main()
  66. {
  67.  
  68.      // init. the random generator
  69.      srand((unsigned)time(NULL));
  70.            
  71.       
  72.      // save original boxes
  73.      Blowfish_GetBoxes(BF_key);   
  74.      Blowfish_SetRounds(16);
  75.      
  76.      
  77.      // en- and decrypt the test vectors... 
  78.  
  79.      // #1 
  80.      puts("test vector #1...");
  81.      Blowfish_Init(key1, sizeof(key1)-1);
  82.      // show the first 6 p-boxes
  83.      pBoxes=(unsigned long*)Blowfish_GetBoxPointer;
  84.      puts("pboxes:");
  85.      for (unI=0; unI<5; unI++) printf("%08lx ", pBoxes[unI]);
  86.      puts("");
  87.      // now encrypt, decrypt and compare with the official values
  88.      printf("plaintext : %08lx %08lx\n", testdata1_p[0], testdata1_p[1]);
  89.      Blowfish_ECBEncrypt(testdata1_p, 8);                             
  90.      printf("ciphertext: %08lx %08lx\n", testdata1_p[0], testdata1_p[1]);
  91.      printf("DDJ 10/95 : %08lx %08lx\n", testdata1_c[0], testdata1_c[1]);
  92.      Blowfish_ECBDecrypt(testdata1_p, 8);
  93.      printf("decrypted : %08lx %08lx\n", testdata1_p[0], testdata1_p[1]);
  94.      puts("");
  95.      
  96.      // #2 
  97.      puts("test vector #2...");
  98.      Blowfish_SetBoxes(BF_key);       // reload original boxes
  99.      Blowfish_Init(key2, sizeof(key2)-1);
  100.      pBoxes=(unsigned long*)Blowfish_GetBoxPointer;
  101.      puts("pboxes:");
  102.      for (unI=0; unI<5; unI++) printf("%08lx ", pBoxes[unI]);
  103.      puts("");
  104.      printf("plaintext : %08lx %08lx\n", testdata2_p[0], testdata2_p[1]);
  105.      Blowfish_ECBEncrypt(testdata2_p, 8);                             
  106.      printf("ciphertext: %08lx %08lx\n", testdata2_p[0], testdata2_p[1]);
  107.      printf("DDJ 10/95 : %08lx %08lx\n", testdata2_c[0], testdata2_c[1]);
  108.      Blowfish_ECBDecrypt(testdata2_p, 8);
  109.      printf("decrypted : %08lx %08lx\n", testdata2_p[0], testdata2_p[1]);
  110.      puts("press ENTER...\n");
  111.      getchar();
  112.      
  113.      
  114.      // start ECB tests with a small buffer... 
  115.      
  116.      // 16 rounds... 
  117.      Blowfish_SetBoxes(BF_key); // reload original boxes 
  118.      strcpy((char*) sMyKey, "I think I climb aboard!");
  119.      Blowfish_Init((unsigned char*) sMyKey, strlen((char*) sMyKey));
  120.      puts("ECB test 16 round...");
  121.      puts("original data:");
  122.      // generate and show random numbers...
  123.      for (unI=0; unI<6; unI++) printf("%08lx  ", testbuf[unI]=random32());
  124.      puts("\nencrypted data:");
  125.      Blowfish_ECBEncrypt(testbuf, 6*4);
  126.      for (unI=0; unI<6; unI++) printf("%08lx  ", testbuf[unI]);
  127.      puts("\ndecrypted data:");
  128.      Blowfish_ECBDecrypt(testbuf, 6*4);
  129.      for (unI=0; unI<6; unI++) printf("%08lx  ", testbuf[unI]);
  130.      puts("\n");
  131.      
  132.      // 32 rounds... 
  133.      Blowfish_SetRounds(32);    // change number of encryption rounds        
  134.      Blowfish_SetBoxes(BF_key);    
  135.      strcpy((char*) sMyKey, "I think I climb aboard!");
  136.      Blowfish_Init((unsigned char*) sMyKey, strlen((char*) sMyKey));
  137.      puts("ECB test 32 round...");
  138.      puts("original data:");
  139.      // (to show the difference we do NOT create new test data)
  140.      for (unI=0; unI<6; unI++) printf("%08lx  ", testbuf[unI]);
  141.      puts("\nencrypted data:");
  142.      Blowfish_ECBEncrypt(testbuf, 6*4);
  143.      for (unI=0; unI<6; unI++) printf("%08lx  ", testbuf[unI]);
  144.      puts("\ndecrypted data:");
  145.      Blowfish_ECBDecrypt(testbuf, 6*4);
  146.      for (unI=0; unI<6; unI++) printf("%08lx  ", testbuf[unI]);
  147.      puts("\npress ENTER...\n");
  148.      getchar();
  149.      
  150.  
  151.      // start CBC tests with a small buffer... 
  152.      
  153.      // 16 rounds... 
  154.      ulCBCLeft=random32();    // init. and save the CBC IV
  155.      ulCBCRight=random32();
  156.      ulCBCIVL=ulCBCLeft;    
  157.      ulCBCIVR=ulCBCRight;
  158.      Blowfish_SetRounds(16);    // reset to 16 encryption rounds
  159.      Blowfish_SetBoxes(BF_key); // reload original boxes 
  160.      strcpy((char*) sMyKey, "Who wants some?");
  161.      Blowfish_Init((unsigned char*) sMyKey, strlen((char*) sMyKey));
  162.      puts("CBC test 16 round...");
  163.      printf("IV: %08lx %08lx\n", ulCBCLeft, ulCBCRight);
  164.      puts("original data:");
  165.      for (unI=0; unI<6; unI++) printf("%08lx  ", testbuf[unI]);
  166.      puts("\nencrypted data:");
  167.      Blowfish_CBCEncrypt(testbuf, 6*4, &ulCBCIVL, &ulCBCIVR);
  168.      for (unI=0; unI<6; unI++) printf("%08lx  ", testbuf[unI]);
  169.      puts("\ndecrypted data:");                          
  170.      // restore the original CBC IV for decryption
  171.      ulCBCIVL=ulCBCLeft;    
  172.      ulCBCIVR=ulCBCRight;
  173.      Blowfish_CBCDecrypt(testbuf, 6*4, &ulCBCIVL, &ulCBCIVR);
  174.      for (unI=0; unI<6; unI++) printf("%08lx  ", testbuf[unI]);
  175.      puts("\n");
  176.      
  177.      // 32 rounds... 
  178.      ulCBCIVL=ulCBCLeft;    // use the same CBC IV as above
  179.      ulCBCIVR=ulCBCRight;
  180.      Blowfish_SetRounds(32);    // set to 32 encryption rounds
  181.      Blowfish_SetBoxes(BF_key); // reload original boxes 
  182.      strcpy((char*) sMyKey, "Who wants some?");
  183.      Blowfish_Init((unsigned char*) sMyKey, strlen((char*) sMyKey));
  184.      puts("CBC test 32 round...");
  185.      printf("IV: %08lx %08lx\n", ulCBCLeft, ulCBCRight);
  186.      puts("original data:");
  187.      for (unI=0; unI<6; unI++) printf("%08lx  ", testbuf[unI]);
  188.      puts("\nencrypted data:");
  189.      Blowfish_CBCEncrypt(testbuf, 6*4, &ulCBCIVL, &ulCBCIVR);
  190.      for (unI=0; unI<6; unI++) printf("%08lx  ", testbuf[unI]);
  191.      puts("\ndecrypted data:");                          
  192.      ulCBCIVL=ulCBCLeft;    
  193.      ulCBCIVR=ulCBCRight;
  194.      Blowfish_CBCDecrypt(testbuf, 6*4, &ulCBCIVL, &ulCBCIVR);
  195.      for (unI=0; unI<6; unI++) printf("%08lx  ", testbuf[unI]);
  196.      puts("\npress ENTER...\n");
  197.      getchar();
  198.  
  199.  
  200.      // benchmark tests, done in CBC mode with a 32kB buffer
  201.      puts("benchmark test\n16 rounds running...");
  202.      Blowfish_SetRounds(16);
  203.      needed_time=clock();
  204.      for (unI=0; unI<TESTLOOPS; unI++) 
  205.        Blowfish_CBCEncrypt((unsigned long*) biggy, BIGBUFSIZE, &ulCBCIVL, &ulCBCIVL);
  206.      needed_time=clock()-needed_time;
  207.      ulRate=( (TESTLOOPS * BIGBUFSIZE) / needed_time) * CLK_TCK;
  208.      printf("%ld bytes per second\n", ulRate);
  209.      puts("32 rounds running...");
  210.      Blowfish_SetRounds(32);
  211.      needed_time=clock();
  212.      for (unI=0; unI<TESTLOOPS; unI++) 
  213.        Blowfish_CBCEncrypt((unsigned long*) biggy, BIGBUFSIZE, &ulCBCIVL, &ulCBCIVL);
  214.      needed_time=clock()-needed_time;
  215.      ulRate=( (TESTLOOPS * BIGBUFSIZE) / needed_time) * CLK_TCK;
  216.      printf("%ld bytes per second\n", ulRate);
  217.  
  218.                      
  219.      return getchar();
  220. };
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.